'''
绘图和临时文件处理程序
'''
from glob import glob
import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
import numpy as np
from datetime import datetime
import os

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题


'''
所有对应文件改名 保证下次处理顺利进行
'''
def rename_file():
    current_cwd = os.getcwd()
    # 修改遥测源码文件名
    os.chdir('tm_ycdat')
    file_list = glob('*.SatYC')
    for fname in file_list:
        os.rename(fname, f'{fname}_done')
        
    file_list = glob('*.dat')
    for fname in file_list:
        os.rename(fname, f'{fname}_done')
    
    file_list = glob('*.tmp')
    for fname in file_list:
        os.rename(fname, f'{fname}_done')
            
    os.chdir(current_cwd)
    
    # 修改事后处理文件
    os.chdir('tm_yccsv')
    file_list = glob('*.dat')
    for fname in file_list:
        os.rename(fname, f'{fname}_done')
    os.chdir(current_cwd)    

    print('临时文件处理结束')



def tmplot():
    yc_file = glob('tm_yccsv\*.dat')
    if len(yc_file) == 0 :
        print('未生成CSV文件 请核实')
        return    
    if len(yc_file) > 1 :
        print('有多个CSV文件 需删除后重新生成')
        return
    
    tmdata = pd.read_csv(yc_file[0], header=0, sep='\t', encoding='GB2312')
    
    # 读入数据 用第0列时间作为索引 且转换为datetime格式
    date_cvt_func = lambda x: datetime.strptime(x, '%Y年%m月%d日%H时%M分%S秒')
    tmdata = pd.read_csv(yc_file[0], header=0, sep='\t', encoding='GB2312',\
        parse_dates=['时间'], date_parser=date_cvt_func, index_col=0)

    tmdata = tmdata.sort_index()  # 按时间排序
    tmdata = tmdata.replace('--', np.nan)  # 去除空行
    tmdata = tmdata.apply(pd.to_numeric, errors='ignore')  # 字符串转数字
    
    # 数据替换 "tmdata.iloc[:,6] < 2.2"表示第6列所有行小于2.2 
    tmdata.iloc[tmdata.iloc[:,6]<2.2, 6] = 2.51
    tmdata.iloc[tmdata.iloc[:,5]<2.2, 5] = 2.51
    tmdata.iloc[tmdata.iloc[:,4]<2.2, 4] = 2.49 
    tmdata.iloc[tmdata.iloc[:,3]<2.2, 3] = 2.45
    tmdata.iloc[tmdata.iloc[:,7]<12500, 7] = 12600
    
    tmdata.iloc[tmdata.iloc[:,6]>2.7, 6] = 2.51
    tmdata.iloc[tmdata.iloc[:,5]>2.7, 5] = 2.51
    tmdata.iloc[tmdata.iloc[:,4]>2.7, 4] = 2.49 
    tmdata.iloc[tmdata.iloc[:,3]>2.47, 3] = 2.45

    # 绘图
    try:
        fig = plt.figure()  # figsize=(6, 6)
        # ----绘制温度曲线
        ax = fig.add_subplot(221)
        ax.plot(tmdata.index, tmdata.iloc[:,0:3], linewidth=1)  # 索引值做横坐标
        # 设置图题 图例和坐标轴旋转
        ax.set_title('DPC温度曲线', fontsize=8)
        ax.set_ylim(-5,30)
        ax.grid(True)
        ax.legend(labels=tmdata.columns[0:3], loc=0, fontsize=6, ncol=1)
        ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%m-%d %H:%M"))
        for lb in ax.xaxis.get_ticklabels():
            lb.set_rotation(45)
            lb.set_fontsize(5)
            lb.set_y(0.06)  # 坐标位置调整 向上移动
        for lb in ax.yaxis.get_ticklabels():
            lb.set_fontsize(6)
        
        # ----绘制电压曲线
        ax = fig.add_subplot(222)
        ax.plot(tmdata.index, tmdata.iloc[:,3:7], linewidth=1)
        # 设置图题 图例和坐标轴旋转
        ax.set_title('DPC电压遥测曲线', fontsize=8)
        ax.set_ylim(2,3)
        ax.grid(True)
        ax.legend(labels=tmdata.columns[3:7] ,loc=0, fontsize=6, ncol=1)
        ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%m-%d %H:%M"))
        for lb in ax.xaxis.get_ticklabels():
            lb.set_rotation(45)
            lb.set_fontsize(5)
            lb.set_y(0.06)  # 坐标位置调整 向上移动
        for lb in ax.yaxis.get_ticklabels():
            lb.set_fontsize(6)
            
        # ----霍尔脉冲
        ax = fig.add_subplot(223)
        ax.plot(tmdata.index, tmdata.iloc[:,7], linewidth=1)
        # 设置图题 图例和坐标轴旋转
        ax.set_title('DPC转动部件曲线', fontsize=8)
        ax.set_ylim(12598,12602)
        ax.grid(True)
        ax.legend(labels=tmdata.columns[7:8] ,loc=0, fontsize=6, ncol=1)
        ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%m-%d %H:%M"))
        for lb in ax.xaxis.get_ticklabels():
            lb.set_rotation(45)
            lb.set_fontsize(5)
            lb.set_y(0.06)  # 坐标位置调整 向上移动
        for lb in ax.yaxis.get_ticklabels():
            lb.set_fontsize(6)
            
        fig.tight_layout()  # 自动调整子图之间间距
        plt.savefig(f'{yc_file[0]}.jpg')
        plt.show()
        plt.close()

        print('绘图完成 处理临时文件')
        rename_file()
        
    except Exception as e:
        print('绘图过程出现异常')
        print('异常信息: '+ repr(e))
    


# if __name__ == '__main__':
#     tmplot()

    